package com.haha.lock;

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
 * 分布式锁策略接口
 * 定义所有分布式锁实现必须提供的方法
 */
public interface DistributedLock {
    
    /**
     * 尝试获取锁（有返回值）
     * @param lockKey 锁的键
     * @param waitTime 最大等待时间
     * @param leaseTime 锁自动释放时间
     * @param unit 时间单位
     * @return true-获取成功, false-获取失败
     */
    boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit);
    
    /**
     * 阻塞式获取锁（直到成功）
     * @param lockKey 锁的键
     * @param leaseTime 锁自动释放时间
     * @param unit 时间单位
     */
    void lock(String lockKey, long leaseTime, TimeUnit unit);
    
    /**
     * 释放锁
     * @param lockKey 锁的键
     */
    void unlock(String lockKey);
    
    /**
     * 检查锁是否被当前线程持有
     * @param lockKey 锁的键
     * @return true-持有, false-未持有
     */
    boolean isHeldByCurrentThread(String lockKey);
    
    /**
     * 在锁保护下执行有返回值的逻辑（高阶用法，推荐）
     * @param lockKey 锁的键
     * @param waitTime 最大等待时间
     * @param leaseTime 锁自动释放时间
     * @param unit 时间单位
     * @param supplier 待执行的有返回值逻辑
     * @return 业务逻辑的执行结果
     */
    <T> T executeWithLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit, Supplier<T> supplier);
    
    /**
     * 在锁保护下执行无返回值的逻辑（高阶用法，推荐）
     * @param lockKey 锁的键
     * @param waitTime 最大等待时间
     * @param leaseTime 锁自动释放时间
     * @param unit 时间单位
     * @param runnable 待执行的逻辑
     */
    void executeWithLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit, Runnable runnable);
}